package review;

public class review1 {
    //为啥会有线程：
    // 首先，程序都是通过一个个进程在计算机中来进行操作的，而进程的创建太重量，于是，我们就引入了线程
    // 首先我们来了解一下 线程的创建--- Thread 类 : Thread 类中有一个run方法，我们需要运行的代码就需要写在这个方法中
    public static void main01(String[] args) {
        //1.继承Thread 类，重写 run 方法
        Thread thread=new Thread(){
            @Override
            public void run() {
                System.out.println(" 继承Thread 类，重写 run 方法");
            }
        };
        thread.start();

        // 2. 实现Runnable 接口，重写 run 方法
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                System.out.println(" 实现Runnable 接口，重写 run 方法");
            }
        };
        Thread thread1=new Thread(runnable);
        thread1.start();

        //3. 匿名内部类重写 run 方法
        Thread thread2=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(" 匿名内部类重写 run 方法");
            }
        });
        thread2.start();

        //4.lambda 表达式重写 run 方法
        Thread thread3=new Thread(()->{
            System.out.println(" lambda 表达式重写 run 方法 ");
        });

    }

    // 进程和线程的区别:
    // 首先，进程是系统资源管理的基本单位，而线程是系统调度的基本单位
    // 其次，一个进程 有 最少一个或多个线程构成
    // 进程间相互独立，互不影响，  线程之间就可能存在相互影响
    // 一个进程中的 线程共享一块内存资源，并共用一套 api 指令，


    // Thread 属性： id name interrupted Stated alive  daemon(后台线程)
    public static void main02(String[] args) {
        Thread t1=new Thread(()->{
            int i=0;
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(i++);
            }
        });
        t1.start();

        // 线程太快，想慢一点------》 sleep（） 休眠

    }


    // 在某个情况下，我突然想中断某个线程

    public static boolean isQuite=false;
    // 这里的isQuite 为啥会设置成 类变量呢，不能 在main方法中定义吗，答案是不可以的：因为我们在创建线程的时候，
    // 使用的lambda表达式，而lambda有一个变量捕获的语法，就是变量只能是类似于 final 类型的

    public static void main(String[] args) throws InterruptedException {
        /*// 方法一： 借助变量
        Thread t1=new Thread(()->{
            while(!isQuite){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("isQuite :"+isQuite);
            }
            System.out.println("isQuite :"+isQuite);
        });
        t1.start();

        Thread.sleep(1000);
        isQuite=true;
        System.out.println(t1.getState());*/

        // 方法二： Thread.cuurentThread.isInterrupted()
        Thread t1=new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread.currentThread().isInterrupted() :"+Thread.currentThread().isInterrupted());
            }
        });
        System.out.println(t1.getState());
        t1.start();
        System.out.println(t1.getState());
        Thread.sleep(1000);
        System.out.println(t1.getState());
        t1.interrupt();
        Thread.sleep(1000);
        System.out.println(t1.getState());
    }
}
